Переходим к структуре лекции. Обозначим основные блоки — от простых схем управления памятью к виртуальной памяти, таблицам страниц и современным подходам.
Начнём с фундамента — иерархии памяти. Обратите внимание на обратную зависимость между скоростью доступа и объёмом каждого уровня.
Сравним крайние уровни иерархии. Это поможет понять, почему ОС приходится управлять памятью так тщательно — разрыв в скорости достигает порядков.
Перечислим ключевые задачи ОС в управлении памятью. Каждая из них будет подробно раскрыта в последующих слайдах.
Простейший случай — в памяти только одна программа. Это отправная точка для понимания эволюции подходов к управлению памятью.
Первый шаг к многозадачности. Обратите внимание на проблему внутренней фрагментации — она мотивирует переход к динамическим разделам.
Динамические разделы решают внутреннюю фрагментацию, но порождают внешнюю. Это фундаментальная проблема, которую решает виртуальная память.
Визуализируем два типа фрагментации. Ключевое различие: внутренняя — потери внутри выделенного блока, внешняя — свободная память разбросана мелкими кусками.
Переход к главной теме лекции. Виртуальная память — революционное решение проблем фрагментации и ограниченности физической памяти.
Важно подчеркнуть: преобразование адресов абсолютно прозрачно для приложения. Программист работает с непрерывным адресным пространством, не зная о реальной физической структуре памяти.
Paging — основной механизм виртуальной памяти. Фиксированный размер страницы (обычно 4 КБ) существенно упрощает управление памятью по сравнению с сегментацией.
Покажем конкретный механизм трансляции. Ключевой момент: смещение внутри страницы остаётся неизменным — меняется только номер кадра.
Таблица страниц — ключевая структура данных. Обратите внимание на служебные биты: presence, dirty, reference — ОС активно использует их для управления памятью.
Одноуровневая таблица для 64-битного адресного пространства заняла бы петабайты. Иерархическая структура позволяет хранить только используемые части таблицы.
Альтернативный подход — одна запись на физический кадр. Это экономит память, но усложняет поиск. Хеширование помогает решить проблему скорости.
Подведём итог сравнением трёх подходов к организации таблиц страниц. Каждый имеет свою нишу: многоуровневые — в x86, инвертированные — в PowerPC.
Page fault — центральное событие в работе виртуальной памяти. Это дорогостоящая операция, требующая обращения к диску, поэтому алгоритмы замещения так важны.
Количественная оценка стоимости page fault. Диск на четыре порядка медленнее RAM — поэтому даже малая вероятность ошибки сильно влияет на эффективное время доступа.
Когда свободных кадров нет, ОС должна выбрать жертву для вытеснения. Рассмотрим четыре алгоритма — от простейшего FIFO к практически применяемому Clock.
Самый простой алгоритм, но с неожиданным свойством — аномалией Билэди: больше кадров может привести к большему числу ошибок. Это мотивирует более сложные подходы.
LRU — «золотой стандарт» по качеству, основан на принципе временной локальности. Но точная реализация дорогая, поэтому на практике используют аппроксимации.
OPT невозможно реализовать — он требует знания будущих обращений. Но он служит теоретическим эталоном: чем ближе реальный алгоритм к OPT, тем лучше.
Clock — практичный компромисс между простотой FIFO и качеством LRU. Использует только бит обращения, что делает реализацию эффективной. Широко применяется в реальных ОС.
Сводная таблица для сравнения. Ни один алгоритм не идеален — каждый со своим компромиссом между сложностью и производительностью.
Локальность — фундаментальное свойство программ, на котором основана эффективность виртуальной памяти. Без неё страничная организация была бы нежизнеспособна.
Два ключевых понятия: рабочий набор определяет минимальную потребность процесса в памяти, трешинг — катастрофическое падение производительности при её неудовлетворении.
Разделяемая память — самый быстрый механизм IPC, так как процессы обращаются к одним и тем же физическим страницам напрямую. Но обязательно нужна синхронизация доступа.
Защита памяти — основа безопасности и стабильности системы. Нарушение защиты мгновенно приводит к исключению — segfault — и завершению процесса.
TLB — критический компонент производительности. Без него каждое обращение к памяти требовало бы обхода многоуровневой таблицы, что недопустимо замедлило бы систему.
При hit rate > 99% TLB практически устраняет накладные расходы на трансляцию. Но даже 1% miss заметно влияет — поэтому так важны оптимизации TLB.
Два направления оптимизации: предварительная загрузка уменьшает задержки, а улучшение структуры таблиц снижает накладные расходы. Huge pages — важный современный инструмент.
Современные реалии: 4–5 уровней таблиц страниц в x86-64. Huge pages (2 МБ, 1 ГБ) критически важны для снижения накладных расходов на трансляцию в таких системах.
Виртуализация добавляет второй уровень трансляции адресов (EPT/NPT). Контейнеры легче — они используют namespaces и cgroups без дополнительных уровней трансляции.
Заглянем в будущее: NVM стирает границу между оперативной и постоянной памятью, а машинное обучение открывает новые подходы к интеллектуальному управлению памятью.
Переходим к подведению итогов лекции.
Главные тезисы лекции в сжатом виде. Рекомендую студентам зафиксировать эти восемь пунктов — они составляют ядро понимания виртуальной памяти.
Десять вопросов для самоконтроля, покрывающих все ключевые темы лекции. Используйте их для проверки глубины понимания материала.
Рекомендую Таненбаума как основу, Silberschatz для углублённого изучения, а Love — для понимания реализации управления памятью в ядре Linux.